home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000
/
Ham Radio 2000.iso
/
ham2000
/
packet
/
terminal
/
top_152
/
src152.exe
/
rar
/
TOPQTH.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1995-05-16
|
13KB
|
372 lines
{┌─────────────────────────────────────────────────────────────────────────┐}
{│ │}
{│ T. O. P. │}
{│ │}
{│ (T)he (O)ther (P)acket │}
{│ │}
{│ T O P Q T H . P A S │}
{│ │}
{│ │}
{│ QTH-Kennerberechnung nach Routinen von DL5FBD (QTHBER V2.2) │}
{└─────────────────────────────────────────────────────────────────────────┘}
(***********************************************************)
(* Procedure Entfernung_Richtung *)
(* Die Prozedur dient zur Berechnung von Entfernung und *)
(* Richtung bei gegebenen geografischen Koordinaten im *)
(* Gradmass. *)
(* Ergebnis sind Entfernung in Kilometern und Richtung in *)
(* Grad von QTH1 nach QTH2. *)
(* O1,N1 Oestliche Laenge,Noerdliche Breite von QTH1 *)
(* O2,N2 Oestliche Laenge,Noerdliche Breite von QTH2 *)
(***********************************************************)
Procedure Entfernung_Richtung (O1,N1,O2,N2 : REAL; Var Entfernung,Richtung : REAL);
Const PI = 3.1415926;
Var EW,RV : REAL;
Function GSIN(WINKEL : REAL) : REAL;
Begin
GSIN := SIN(Winkel*PI/180);
End;
Function GCOS(WINKEL : REAL) : REAL;
Begin
GCOS:=COS(Winkel*PI/180);
End;
Function ARCGCOS(COSINUS : REAL) : REAL;
Var ARCBOG : REAL;
Begin
if COSINUS >= 1 then ARCGCOS := 0 else
if COSINUS <= -1 then ARCGCOS := 180 else
begin
ARCBOG := PI/2-ARCTAN(COSINUS/(SQRT(1-SQR(COSINUS))));
ARCGCOS := ARCBOG*180/PI;
end;
End;
Begin
EW := arcgcos(gsin(n1)*gsin(n2)+gcos(n1)*gcos(n2)*gcos(o2-o1));
Entfernung := 40009/360*EW;
RV := arcgcos((gsin(n2)-gsin(n1)*gcos(ew))/(gcos(n1)*gsin(ew)));
if gsin(o2-o1) >= 0 then Richtung := RV;
if gsin(o2-o1) < 0 then Richtung := 360-RV;
End;
(***********************************************************)
(* Procedure NEU_IN_WINKEL *)
(* Diese Procedure dient zum Umwandeln eines neuen QTH- *)
(* kenners in geografische Laenge und Breite *)
(* I Indexvariable fuer Feldzuweisung *)
(* OESLAE Oestliche Laenge als Gleitkommawinkel *)
(* NOEBRE Noerdliche Breite als Gleitkommawinkel *)
(* QTHKENN QTH-Kenner als STRING *)
(* WIINFO[6] Feld der QTH-Kennerindexziffern *)
(* ASCKOR[6] Hilfsfeld zur ASCII-Indexziffernumrechnung *)
(* Maske [6] Hilfsfeld zur Grossschrifteinstellung *)
(***********************************************************)
Procedure NEU_IN_WINKEL(QTHKENN :STR20; Var OESLAE,NOEBRE : REAL);
Const ASCKOR : Array [1..6] of Byte = (065,065,048,048,065,065);
MASKE : Array [1..6] of Byte = (223,223,255,255,223,223);
Var i : Byte;
WIINFO : Array [1..6] of Byte;
Begin
for i := 1 to 6 do WIINFO[i]:=(ORD(qthkenn[i]) AND MASKE[i])-ASCKOR[i];
OESLAE := -180 + WIINFO[1] * 20 + WIINFO[3] * 2 + WIINFO[5]/12+1/24;
NOEBRE := -90 + WIINFO[2] * 10 + WIINFO[4] * 1 + WIINFO[6]/24+1/48;
End;
(***********************************************************)
(* Procedure GRAD_UMW *)
(* Diese Procedure wandelt eine als String uebergebene *)
(* geografische Koordinate im Format +GGG:MM:SS/-GG:MM:SS *)
(* mit Unterlaengen +GG:MM und -GG in die entsprechenden *)
(* Gleitkommawinkel um. (Oestl. Laenge/Noerd. Breite) *)
(* Uebergeben wird der Koordinatenstr. und zurueck werden *)
(* die Gleitkommawinkel und eine Statusvariable uebergeben *)
(* Ist diese False so ist ein Formatfehler entdeckt worden *)
(* und die uebergebenen Winkelparameter undefiniert. *)
(* QTHKENN Koordinatenstring *)
(* OESLAE Oestliche Laenge als REAL-Zahl *)
(* NOEBRE Noerdliche Breite als REAL-Zahl *)
(* STATUS TRUE Umwandlung erfolgreich vorgenommen *)
(* FALSE Formatfehler entdeckt oder Bereichs- *)
(* fehler der Koordinatenwinkel *)
(* MENGE Definition des Stringmengentyps *)
(* REFERENZ Gueltige Elementemenge von QTHKENN *)
(* RASTER Feld der gueltigen Formatraster von QTHKENN *)
(* I Index fuer Feldzugriffe *)
(* P Position des Trennzeichens '/' in QTHKENN *)
(* und Kontrollvariable fuer VAL-Funktion *)
(* OES,NOE String der oestlichen Laenge,noerdl. Breite *)
(* zur Umwandlung in den Gleitkommawinkel *)
(* VERGLEICH Strukturabbild von QTHKENN zur Format- *)
(* pruefung des Koordinatenstrings *)
(* LAENGE Laenge von QTHKENN fuer Abfrageschleifen *)
(***********************************************************)
Procedure GRAD_UMW (QTHKENN :STRING;
VAR OESLAE,NOEBRE :REAL;
VAR STATUS :BOOLEAN);
(***********************************************************)
(* FUNCTION GMS_UMW *)
(* Die Funktion dient zur Umwandlung des Laengen und *)
(* Breitengradstring in den entsprechenden Gleitkommawinkel*)
(* GMS Stringteil mit Winkelinformation +GG:MM:SS *)
(* UMWAND Gleitkommawinkel *)
(* REST Teilstring fuer Entnahme der GG,MM,SS-Info *)
(* POSI Position des Trennzeichens DP in REST *)
(* VORZEI Vorzeichenfaktor des Winkels +1 oder -1 *)
(* I Potenz des Minuten und Sekundenfaktors zur *)
(* BASIS 60 fuer Gleitkommawinkelberechnung *)
(* D Fehlerposition fuer VAL-Procedure *)
(* Teil Enthaelt Ziffernfaktor fuer Grad,Min.,Sekunden *)
(* Summe Teil- und Endsumme des Gleitkommawinkels *)
(***********************************************************)
Function GMS_UMW (GMS : Str20) : Real;
Var REST : STRING;
POSI : BYTE;
VORZEI : ShortInt;
I : BYTE;
D : INTEGER;
Teil : REAL;
SUMME : REAL;
BEGIN
I := 0;
SUMME := 0;
REST := GMS;
IF GMS[1]='-' then VORZEI := -1
else VORZEI := 1;
Repeat
Val(REST,TEIL,D);
IF D <> 0 then Val((COPY(REST,1,D-1)),TEIL,D);
IF i = 0 then SUMME := TEIL
else SUMME := SUMME+VORZEI*TEIL/(EXP(LN(60)*i));
inc(i);
POSI := pos(DP,REST);
REST := copy(REST,POSI+1,(LENGTH(REST)-POSI));
Until POSI = 0;
GMS_UMW := SUMME
End;
Type MENGE = Set of Char;
Const REFERENZ : MENGE = ['0'..'9','+','-','/',DP,Pkt ];
RASTER : Array [1..12] of string
= ('VZ:Z:Z/VZ:Z:Z' , 'VZ:Z:Z/VZ:Z' , 'VZ:Z:Z/VZ' ,
'VZ:Z/VZ:Z:Z' , 'VZ:Z/VZ:Z' , 'VZ:Z/VZ' ,
'VZ/VZ:Z:Z' , 'VZ/VZ:Z' , 'VZ/VZ' ,
'VZ.Z/VZ.Z' , 'VZ/VZ.Z' , 'VZ.Z/VZ');
Var i : Byte;
P : Integer;
OES,NOE,
VERGLEICH : String;
LAENGE : Byte;
Begin
(* 1. Stringformat und Zeichengueltigkeit ueberpruefen *)
(* 2. Wenn gueltig in Gleitkommawinkel umwandeln und *)
(* danach Gueltigkeitspruefung der Winkel vornehmen *)
(* 3. Wenn auch das in Ordnung Winkel und STATUS=TRUE *)
LAENGE := LENGTH(QTHKENN);
IF LAENGE <= 20 THEN
BEGIN
(* Ueberpruefung von Format und Inhalt der Stringinformation *)
VERGLEICH:='';
For I:=1 to LAENGE do
BEGIN
IF NOT(QTHKENN[I] IN REFERENZ) THEN VERGLEICH:=VERGLEICH+'?'
ELSE
BEGIN
IF QTHKENN[I] IN ['+','-'] THEN VERGLEICH:=VERGLEICH+'V';
IF QTHKENN[I] ='/' THEN VERGLEICH:=VERGLEICH+'/';
IF QTHKENN[I] =DP THEN VERGLEICH:=VERGLEICH+DP ;
IF QTHKENN[I] =Pkt THEN VERGLEICH:=VERGLEICH+Pkt ;
IF QTHKENN[I] IN ['0'..'9'] THEN
BEGIN
P:=LENGTH(VERGLEICH);
IF VERGLEICH[P]<>'Z' THEN VERGLEICH:=VERGLEICH+'Z';
END;
END;
END;
(* Vorzeichenkennungen fuer Schreibfaule nachtragen *)
IF VERGLEICH[1]='Z' THEN Insert('V',VERGLEICH,1);
P:=Pos('/',VERGLEICH)+1;
IF VERGLEICH[P]='Z' THEN Insert('V',VERGLEICH,P);
(* Abfrage ob Vergleichsraster einem der gueltigen *)
(* Raster entspricht *)
STATUS:=False;
FOR I:=1 to 12 do
STATUS:=STATUS OR (VERGLEICH = RASTER[I]);
END
ELSE STATUS := FALSE;
(* 3. Zeichenkette in Koordinaten umwandeln wenn in Ordnung *)
IF STATUS THEN
BEGIN
P:=POS('/',QTHKENN);
OES:=Copy(QTHKENN,1,P-1);
NOE:=Copy(QTHKENN,P+1,(LAENGE-P));
IF POS(Pkt ,OES) > 0 THEN VAL(OES,OESLAE,P)
ELSE OESLAE := GMS_UMW(OES);
IF POS(Pkt ,NOE) > 0 THEN VAL(NOE,NOEBRE,P)
ELSE NOEBRE := GMS_UMW(NOE);
IF ABS(NOEBRE) > 90 THEN STATUS := False;
IF ABS(OESLAE) > 180 THEN STATUS := False;
END;
END;
Procedure QTH_ENTFG_RICHTG (QTH1,QTH2 : Str20;
var ENTFG,
RICHTG : REAL;
var STATUS : Boolean);
Var QTH : Array[1..2] of Str20;
Winkel : Array[1..4] OF Real;
I : Byte;
K : ShortInt;
LAENGE : Byte;
BEGIN
QTH[1] := QTH1;
QTH[2] := QTH2;
K := -1;
STATUS := true;
for i := 1 to 2 do if STATUS then
begin
LAENGE := length(QTH[I]);
K := K + 2;
if QTH[I][1] in ['+','-','0'..'9'] then
begin
GRAD_UMW(QTH[I],WINKEL[K],WINKEL[K+1],STATUS);
end else if LAENGE = 6 then
begin
NEU_IN_WINKEL(QTH[I],WINKEL[K],WINKEL[K+1]);
end else STATUS:=False;
end;
if STATUS then
ENTFERNUNG_RICHTUNG(WINKEL[1],WINKEL[2],WINKEL[3],WINKEL[4],ENTFG,RICHTG);
End;
Procedure Compute_QTH (* Var Zeile : Str80 *);
Const DXC = 'DXC.DAT';
Var f : Text;
Flag : Boolean;
i,l,
AnzP : Byte;
Diff : ShortInt;
Entf,
Azim : Real;
Dstr : String[3];
Sstr : String[6];
Tstr : String[8];
Fstr : String[13];
QTH : String[20];
Nstr : String[40];
Lstr,
Rstr,
Hstr : String;
Begin
Hstr := ParmStr(3,B1,Zeile);
if Hstr[length(Hstr)] = DP then
begin
Flag := false;
Assign(f,SysPfad + DXC);
if ResetTxt(f) = 0 then
begin
Readln(f,Hstr);
QTH := ParmStr(4,B1,Hstr);
Fstr := ParmStr(5,B1,Zeile);
l := 0;
While not Eof(f) do
begin
Readln(f,Hstr);
Lstr := ParmStr(1,DP,Hstr);
Sstr := ParmStr(1,Km,Lstr);
ParmAnz := AnzP;
i := 0;
Repeat
inc(i);
Sstr := ParmStr(i,Km,Lstr);
if (pos(Sstr,Fstr) = 1) and (ord(Sstr[0]) > l) then
begin
Flag := true;
l := ord(Sstr[0]);
Rstr := Hstr;
end;
Until i >= AnzP;
end;
FiResult := CloseTxt(f);
if Flag then
begin
Lstr := ParmStr(1,DP,Rstr);
Zeile := EFillStr(27,B1,ParmStr(2,DP,Rstr));
Zeile := Zeile + 'Zone' + DP + SFillStr(3,B1,ParmStr(3,DP,Rstr)) + B2 + 'Dist' + DP;
Lstr := ParmStr(4,DP,Rstr);
Dstr := ParmStr(3,';',Lstr);
i := pos(Pkt,Dstr);
if i > 0 then Dstr := copy(Dstr,1,i-1);
Diff := ShortInt(str_int(Dstr));
Tstr := Uhrzeit;
Tstr := UtcZeit;
i := str_int(copy(Tstr,1,2));
i := i + 24 + Diff;
While i > 23 do i := i - 24;
Tstr := SFillStr(2,'0',int_str(i)) + DP + copy(Tstr,4,2);
QTH_ENTFG_RICHTG(QTH,ParmStr(2,';',Lstr) + '/' +
ParmStr(1,';',Lstr),Entf,Azim,Flag);
if Flag then
begin
Zeile := Zeile + SFillStr(6,B1,int_str(Round(Entf))) + B1 + 'km' + B3 + 'Beam' + DP +
SFillStr(4,B1,int_str(Round(Azim))) + '°' +
B3 + '(' + Tstr + ')';
end;
end else Zeile := '';
end else WishDXC := false;
end else Zeile := '';
End;